package com.own.business.resource.business.util;

import com.own.business.resource.core.model.base.BaseUploadModel;
import com.own.business.resource.entity.po.FileRecord;

import java.io.File;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * FileRecordUtil
 *
 * @author chenxueli
 * @date 2023-07-07 17:21:00
 */
public class FileRecordUtil {

    /**
     * 路径正则规则
     */
    private static final Pattern PATH_PATTERN = Pattern.compile("https?://[^/]+(/[^?#]+)");

    /**
     * 构建保存的文件以及处理相关持久化内容
     *
     * @param file 上传对象
     * @return 保存后可视对象
     */
    public static FileRecord build(BaseUploadModel file) {
        file.close();
        return buildPo(file);
    }

    /**
     * 获取文件位置
     *
     * @param uri 资源路径
     * @return 位置
     */
    public static String getPosition(String uri) {
        if (!uri.startsWith("http")) {
            return null;
        }
        // 获取到一个斜杠的位置
        var index = uri.indexOf("/", 8);
        if (index == -1) {
            return uri;
        }
        return uri.substring(0, index);
    }

    /**
     * 获取文件路径
     *
     * @param uri 资源路径
     * @return 路径
     */
    public static String getPath(String uri) {
        var matcher = PATH_PATTERN.matcher(uri);
        var tempPath = matcher.find() ? matcher.group(1) : uri;
        if (tempPath.startsWith("/")) {
            tempPath = tempPath.substring(1);
        }
        return tempPath;
    }

    /**
     * 构建保存的文件以及处理相关持久化内容
     *
     * @param fileList 上传对象列表
     * @return 保存后可视对象
     */
    public static List<FileRecord> build(List<BaseUploadModel> fileList) {
        return fileList.stream().peek(BaseUploadModel::close).map(FileRecordUtil::buildPo).collect(Collectors.toList());
    }

    /**
     * 构建单个持久化对象
     *
     * @param file 上传的文件信息
     * @return 持久化对象信息
     */
    private static FileRecord buildPo(BaseUploadModel file) {
        var po = new FileRecord();
        po.setOldName(file.getOldFileName());
        po.setName(file.getFileName());
        po.setPath(File.separator + file.getFolder() + File.separator + file.getFileName());
        po.setSize(file.getFileSize());
        po.setType(file.getContentType());
        po.setMd5(file.getMd5());
        po.setPosition(file.getPosition());
        return po;
    }

}
